package com.hq.common.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletResponse;


public class IOUtil {
	
	// 关流
	//参数中有...  意味着 方法的参数是一个  数组（不限长度的）
	public static void closeStream(Closeable... closeAble) {
		for (Closeable closeable2 : closeAble) {
			try {
				closeable2.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	//复制流
	// 思路 ：一个输入流 负责读取数据  一个输出流负责将数据写道指定位置
	public static void copyTo(InputStream input, 
			OutputStream output, 
			boolean needCloseInput, boolean needCloseOutput) throws IOException {
		
		if (input == null || output == null) return;
		// 输入流缓冲区
		BufferedInputStream bis = new BufferedInputStream(input);
		// 输出流缓冲区
		BufferedOutputStream bos = new BufferedOutputStream(output);
		// 数组存储数据流
		byte[] buffer = new byte[1024];
		
		// 从输入流读取  直到最后返回-1时结束读取
		while (bis.read(buffer) != -1) {
			// 将读取的输入流  写入 输出流中
			bos.write(buffer);
		}
		
		// 由于使用了缓冲输出流。如果没有关闭该 流，则必须flush，如果关闭了这个流，在关闭时会自动flush
		bos.flush();
		
		if (needCloseInput) {
			closeStream(input);
		}
		
		if (needCloseOutput) {
			closeStream(output);
		}
	}
	
	// 读取文本文件
	public static String readTextFile(File file) throws Exception {
		// 如果文件为null 那么方法直接返回的就是一个null值
		if (file == null) return null;
		// 创建字符串缓冲区 用来  将string的值放进来 （不使用string是为了节省资源的消耗）
		StringBuffer sb = new StringBuffer();
		// 输入流
		FileReader fileReader = new FileReader(file);
		// 输入流的缓冲区
		BufferedReader br=new BufferedReader(fileReader);
//		String readLine = br.readLine();  按照整行读取  整行读取到文件尾部的判断依据
		//  返回的是null 证明到达文件尾部
		String readLine =null;
		while((readLine=br.readLine())!=null) {
			// 将读取到的数据放入到  字符串缓冲区中 StringBuffer
			sb.append(readLine);
		}
		return sb.toString();// 以字符串的形式 返回出来
	}
	
	// 按行读取文本文件
	public static List<String> readTextFileByLine(File file) throws Exception {
		// 如果参数为null 那么直接返回的就是null
		if (file == null) return null;
		// 创建集合用来收据数据
		List<String> list=new ArrayList<String>();
		// 输入流
		FileReader fileReader = new FileReader(file);
		// 输入流缓冲区
		BufferedReader br=new BufferedReader(fileReader);
		//  文本的数据流  按行读取
		String readLine = br.readLine();
		// 如果readLine 是null 证明到达文件尾部
		while(readLine!=null) {
			// 每读取一行数据  就把他放到集合之中
			list.add(readLine);
			// 保证循环继续下去
			readLine = br.readLine();
		}
		return list;
	}
	
	//写入文本文件				String 参数是内容    File 是文件
	public static void  inFileWrite(String content,File file) throws IOException {
		// 用到了输出流    如果参数第二个为true 证明我在文件中 是追加而不是覆盖
		OutputStream os=new FileOutputStream(file,true);
		// 将内容 转成byte数组  
		byte[] bytes = content.getBytes();
		// 将byte数组中的内容写到 文件中（从头到尾）
		os.write(bytes, 0, bytes.length);
		closeStream(os);
	}
	
	
	//网络文件下载
	public static void downloadFile(InputStream is,HttpServletResponse response,boolean closeInputStream,
			boolean closeResponse) throws IOException {
		//从response中获取 输出流
		OutputStream os = response.getOutputStream();
		//输入流缓冲区
		BufferedInputStream bis = new BufferedInputStream(is);
		// 输出流 缓冲区
		BufferedOutputStream bos = new BufferedOutputStream(os);
		// 容器  存储数据
        byte[] buffer = new byte[1024];
        //  读取文件 如果返回值为-1 证明到达文件尾部 
        int bytesRead = bis.read(buffer);
        while (bytesRead != -1){ //重点
           bos.write(buffer, 0, bytesRead);// 将文件发送到客户端
           bytesRead=bis.read(buffer);// 保证循环继续
        }
        // 是否关流的操作
        if(closeInputStream) {
        	closeStream(bis,is);
        }
        if(closeResponse) {
        	closeStream(bos,os);
        }
	}
	
}
